package br.org.acessobrasil.portal.action;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import br.org.acessobrasil.portal.facade.PaginaFacade;
import br.org.acessobrasil.portal.modelo.ItemMenu;
import br.org.acessobrasil.portal.modelo.PadraoApresentacao;
import br.org.acessobrasil.portal.modelo.Pagina;
import br.org.acessobrasil.portal.modelo.Sitio;
import br.org.acessobrasil.portal.modelo.Usuario;
import br.org.acessobrasil.portal.util.ListItem;

/**
 * CRUD de pagina
 * @author Fabio Issamu Oshiro
 *
 */
public class PaginaAction extends Super {

	private static final long serialVersionUID = 1293801945334863313L;
	private static Logger logger = Logger.getLogger(PaginaAction.class);
	private Sitio sitio;
	private List<Pagina> listPagina;
	private List<Sitio> listSitio;
	private List<PadraoApresentacao> listPadraoApresentacao;
	private List<ListItem> listItemMenu = new ArrayList<ListItem>();
	private ItemMenu itemMenu = null;
	private PaginaFacade paginaFacade;
	private Long nu_pagina;
	private Long nuPadraoApresentacao;
	
	public ItemMenu getItemMenu() {
		return itemMenu;
	}
	/**
	 * Define para qual item de menu sera a pagina
	 * @param itemMenu
	 */
	public void setItemMenu(ItemMenu itemMenu) {
		this.itemMenu = itemMenu;
	}
	
	private Pagina pagina;

	public PaginaAction(PaginaFacade paginaFacade) {
		this.paginaFacade = paginaFacade;
	}
	
	/**
	 * Define uma pagina como sendo a principal de um sitio
	 * @return SUCCESS
	 */
	public String paginaPrincipal(){
		Usuario usuario = getUsuarioLogado();
		try{
			try{
				paginaFacade.alterarParaPrincipal(usuario, pagina.getNuPagina());
				usuario.addActionMessage(getText("aviso.sucesso"));
			}catch(Exception e){
				usuario.addActionError(getText("erro.pagina404"));
			}
		}catch(Exception e){
			logger.error("Erro ao definir pagina principal",e);
			usuario.addActionError("Erro: " + e.getMessage());
		}
		//Lista as paginas novamente
		return listar();
	}
	private void carregarListas(){
		sitio = super.getSitioAtual();
		List<ItemMenu> listTemp = paginaFacade.listarItemMenu(sitio.getNuMenuPrincipal());
		for (ItemMenu itemMenu : listTemp) {
			ListItem t = new ListItem();
			t.setKey(itemMenu.getNuItemMenu());
			t.setValue(itemMenu.getNoTitulo());
			//coloca ".." de acordo com o nuNivel do item do menu
			for (int i = 1; i < itemMenu.getNuNivel(); i++) {
				t.setValue(".."+t.getValue());
			}
			listItemMenu.add(t);
		}
		listPadraoApresentacao = paginaFacade.listarPadraoApresentacao(sitio);
	}
	
	public String abrirPagina() {
		Usuario usuario = getUsuarioLogado();
		if(pagina == null || pagina.getNuPagina() == null){
			return INPUT;
		}
		try{
			pagina = paginaFacade.buscar(usuario,pagina.getNuPagina());
			pagina = (Pagina)pagina.clone();
			//Bug de abrir pagina com sitio diferente
			sitio = super.getSitioAtual();
			if(sitio==null){
				sitio=new Sitio();
				sitio.setNuSitio(pagina.getNuSitio());
			}
			if(!sitio.getNuSitio().equals(pagina.getSitio().getNuSitio())){
				//se o sitio de trabalho for diferente da pagina entao trocamos o sitio de trabalho
				sitio = pagina.getSitio();
				super.setSitioAtual(sitio);
				usuario.addActionMessage(getText("aviso.sitiodetrabalhoalterado")+sitio.getNoSitio());
			}
			if(pagina.getUri()==null){
				pagina.setUri(getText("predefinido.uri"));
			}
			carregarListas();
		}catch(Exception e){
			logger.error("Erro ao abrir pagina ",e);
		}
		return SUCCESS;
	}
	
	/**
	 * processo usado tambem pelo atualizar
	 * @return SUCCESS
	 */
	public String adicionarPagina() {
		carregarListas();
		Usuario usuario = getUsuarioLogado();
		if (pagina != null) {
			try {
				validar(pagina);
				pagina.setSitio(getSitioAtual());
				pagina.setNuSitio(getSitioAtual().getNuSitio());
				
				//Remove o conteudo padrao ou em branco
				if(pagina.getUri()!=null && (pagina.getUri().equals(getText("predefinido.uri"))|| pagina.getUri().trim().equals(""))){
					pagina.setUri(null);
				}
				if (pagina.getNuPagina() == null || pagina.getNuPagina().equals(0L)) {
					//cria a pagina
					paginaFacade.criar(usuario, pagina, itemMenu);
					nu_pagina = pagina.getNuPagina();
					usuario.addActionMessage("P&aacute;gina \""+pagina.getNoTitulo()+"\" criada com sucesso.");
					
					//Reinicializa dados vitais e mantem os comuns;
					pagina.setNuPagina(null);
					pagina.setNoTitulo(getText("predefinido.titulo"));
					pagina.setDePagina(getText("predefinido.descricao"));
					pagina.setUri(getText("predefinido.uri"));
					
					if(itemMenu!=null && itemMenu.getNuItemMenu()!=null){
						usuario.addActionMessage("Item de menu atualizado para apontar para esta p�gina.");
					}
				} else {
					//atualiza
					paginaFacade.atualizar(usuario, pagina);
					usuario.addActionMessage("P&aacute;gina atualizada com sucesso.");
				}
				//Coloca o uri predefinido novamente
				pagina = (Pagina)pagina.clone();
				if(pagina.getUri()==null){
					pagina.setUri(getText("predefinido.uri"));
				}
			} catch (Exception e) {
				logger.error("Erro foi aqui: ",e);
				usuario.addActionError("Erro: " + e.getMessage());
			}
		} else {
			inicializarDadosPagina();
		}
		return SUCCESS;
	}
	
	private void inicializarDadosPagina(){
		pagina = new Pagina(); 
		pagina.setNoTitulo(getText("predefinido.titulo"));
		pagina.setDePagina(getText("predefinido.descricao"));
		pagina.setUri(getText("predefinido.uri"));
		if(itemMenu!=null && itemMenu.getNuItemMenu()!=null){
			try{
				itemMenu = paginaFacade.buscarItemMenu(itemMenu.getNuItemMenu());
				pagina.setNoTitulo(itemMenu.getNoTitulo());
				pagina.setNuItemMenuSecao(itemMenu.getNuItemMenu());
			}catch(Exception e){
				logger.error("Erro ao pegar o item de menu");
			}
		}
	}

	public void validar(Pagina pagina) throws Exception {
		if (pagina.getNoTitulo().trim().equals("")) {
			throw new Exception("O campo t&iacute;tulo &eacute; obrigat&oacute;rio.");
		}
	}

	public String apagarPagina() {
		if (btnCancelar == null) {
			try{
				pagina = paginaFacade.buscar(getUsuarioLogado(),pagina.getNuPagina());	
				if(pagina.getListConteudo().size()>0){
					addActionError("Esta p&aacute;gina possui conte&uacute;dos, por isso n&atilde;o &eacute; poss&iacute;vel apag&aacute;-la.");
					return INPUT;
				}else{
					paginaFacade.excluir(getUsuarioLogado(), pagina);
				}
			}catch(Exception e){
				logger.error("erro ao apagar pagina"+pagina,e);
			}
		}
		return SUCCESS;
	}

	public String confirmarApagarPagina() {
		try{
			pagina = paginaFacade.buscar(getUsuarioLogado(),pagina.getNuPagina());	
		}catch(Exception e){
			logger.error("Erro ao confirmar apagar a pagina",e);
		}
		return SUCCESS;
	}

	public String listar() {
		listSitio = getUsuarioLogado().getListSitio();
		/*
		if (sitio == null) {
			sitio = getSitioAtual();
			if (sitio==null){
				sitio = getSitioAtual();
			}
		}
		setSitioAtual(sitio);
		*/
		listPagina = paginaFacade.listar(getSitioAtual().getNuSitio());
		return SUCCESS;
	}
	

	public String pesquisar(){
		listSitio = getUsuarioLogado().getListSitio();
		listPagina = paginaFacade.pesquisarPorTitulo(getSitioAtual().getNuSitio(),pagina.getNoTitulo());
		return SUCCESS;
	}
	
	public String listarPaginasPorPadraoApresentacao() {
		listSitio = getUsuarioLogado().getListSitio();
		listPagina = paginaFacade.listarPorPadraoApresentacao(getSitioAtual().getNuSitio(),nuPadraoApresentacao);
		return SUCCESS;
	}
	
	/**
	 * Cria uma lista com os niveis
	 * @param listTemp
	 * @return lista com os niveis
	 */
	public static List<ListItem> criarListaHierarquica(List<ItemMenu> listTemp){
		List<ListItem> retorno = new ArrayList<ListItem>();
		for (ItemMenu itemMenu : listTemp) {
			ListItem t = new ListItem();
			t.setKey(itemMenu.getNuItemMenu());
			t.setValue(itemMenu.getNoTitulo());
			//coloca ".." de acordo com o nuNivel do item do menu
			for (int i = 1; i < itemMenu.getNuNivel(); i++) {
				t.setValue(".."+t.getValue());
			}
			retorno.add(t);
		}
		return retorno;
	}
	
	public String carregarPagina() {
		return SUCCESS;
	}

	public String deletarPagina() {
		return SUCCESS;
	}

	public String atualizarPagina() {
		return adicionarPagina();
	}

	public Sitio getSitio() {
		return sitio;
	}

	public void setSitio(Sitio sitio) {
		this.sitio = sitio;
	}

	public List<Pagina> getListPagina() {
		return listPagina;
	}

	public void setListPagina(List<Pagina> listPagina) {
		this.listPagina = listPagina;
	}

	public List<Sitio> getListSitio() {
		return listSitio;
	}

	public void setListSitio(List<Sitio> listSitio) {
		this.listSitio = listSitio;
	}

	public Pagina getPagina() {
		return pagina;
	}

	public void setPagina(Pagina pagina) {
		this.pagina = pagina;
	}

	public List<PadraoApresentacao> getListPadraoApresentacao() {
		return listPadraoApresentacao;
	}

	public void setListPadraoApresentacao(List<PadraoApresentacao> listPadraoApresentacao) {
		this.listPadraoApresentacao = listPadraoApresentacao;
	}

	public List<ListItem> getListItemMenu() {
		return listItemMenu;
	}

	public void setListItemMenu(List<ListItem> listItemMenu) {
		this.listItemMenu = listItemMenu;
	}
	
	public Long getNu_pagina() {
		return nu_pagina;
	}
	public void setNu_pagina(Long nuPagina) {
		nu_pagina = nuPagina;
	}
	
	public Long getNuPadraoApresentacao() {
		return nuPadraoApresentacao;
	}
	public void setNuPadraoApresentacao(Long nuPadraoApresentacao) {
		this.nuPadraoApresentacao = nuPadraoApresentacao;
	}
}
